package com.serviportales.serviquality.maestroProyectos.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import com.icesoft.faces.component.ext.RowSelectorEvent;
import com.icesoft.faces.component.selectinputtext.SelectInputText;
import com.liferay.util.bridges.jsf.common.FacesMessageUtil;
import com.rits.cloning.Cloner;
import com.serviportales.serviportales.beans.Contexto;
import com.serviportales.serviportales.frontController.ListHolder;
import com.serviportales.serviportales.model.DataTypesBeans;
import com.serviportales.serviquality.datatypes.EstadoRegistro;
import com.serviportales.serviquality.exception.ServiqualityException;
import com.serviportales.serviquality.managers.MgrConstantes;
import com.serviportales.serviquality.managers.MgrProyectoUser;
import com.serviportales.serviquality.model.Proyecto;
import com.serviportales.serviquality.model.ProyectoUser;

@ManagedBean(name = "fcUsers", eager = true)
@ViewScoped
public class FCUsers implements Serializable {

	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(getClass());

	private Proyecto proyecto;
	private ProyectoUser proyectoUserSelected;
	private ListHolder<ProyectoUser> users;
	private List<EstadoRegistro> estadosRegistro;
	private List<SelectItem> usersAutocomplete;

	private boolean visibleProyectoUserForm;

	@PostConstruct
	public void init() {
		users = new ListHolder<ProyectoUser>();
		users.setFilter(new ProyectoUser());
		estadosRegistro = DataTypesBeans.getInstance().getGrupoBeans(EstadoRegistro.class);
		initProyectoUserSelected();
		visibleProyectoUserForm = false;
	}

	public Proyecto getProyecto() {
		return proyecto;
	}

	public void setProyecto(Proyecto proyecto) {
		Cloner cloner = new Cloner();
		this.proyecto = cloner.deepClone(proyecto);
		users.getFilter().getProyectoUserPK().setProyecto(this.proyecto);
		traerLista();
	}

	public ListHolder<ProyectoUser> getUsers() {
		return users;
	}

	public void setUsers(ListHolder<ProyectoUser> users) {
		this.users = users;
	}

	public List<EstadoRegistro> getEstadosRegistro() {
		return estadosRegistro;
	}

	public void setEstadosRegistro(List<EstadoRegistro> estadosRegistro) {
		this.estadosRegistro = estadosRegistro;
	}

	public List<SelectItem> getUsersAutocomplete() {
		return usersAutocomplete;
	}

	public void setUsersAutocomplete(List<SelectItem> usersAutocomplete) {
		this.usersAutocomplete = usersAutocomplete;
	}

	public ProyectoUser getProyectoUserSelected() {
		return proyectoUserSelected;
	}

	public void setProyectoUserSelected(ProyectoUser proyectoUserSelected) {
		this.proyectoUserSelected = proyectoUserSelected;
	}

	public boolean isVisibleProyectoUserForm() {
		return visibleProyectoUserForm;
	}

	public void setVisibleProyectoUserForm(boolean visibleProyectoUserForm) {
		this.visibleProyectoUserForm = visibleProyectoUserForm;
	}

	private void initProyectoUserSelected() {
		proyectoUserSelected = new ProyectoUser();
		proyectoUserSelected.getProyectoUserPK().setProyecto(proyecto);
		proyectoUserSelected.setEstadoRegistro(new EstadoRegistro());
	}

	public void closePopupProyectoUserForm() {
		visibleProyectoUserForm = false;
	}

	public void openPopupProyectoUserForm() {
		visibleProyectoUserForm = true;
		initProyectoUserSelected();
	}

	public void traerLista() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			MgrProyectoUser mgrProyectoUser = ((MgrProyectoUser) Contexto.getApplicationContext().getBean("mgrProyectoUser"));
			users.setSource(mgrProyectoUser.buscarProyectoUsers(users.getFilter()));
		} catch (ServiqualityException serviqualityException) {
			MessageSource messageSource = Contexto.getMessageSource();
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}

	public void selectedProyectoUser(RowSelectorEvent rowSelectorEvent) {
		Cloner cloner = new Cloner();
		for (ProyectoUser proyectoUserLista : users.getSource()) {
			if (proyectoUserLista.isSelected()) {
				proyectoUserSelected = cloner.deepClone(proyectoUserLista);
				visibleProyectoUserForm = true;
				break;
			}
		}
	}

	public void selectUserValueChanged(ValueChangeEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		MgrProyectoUser mgrProyectoUser = ((MgrProyectoUser) Contexto.getApplicationContext().getBean("mgrProyectoUser"));
		MessageSource messageSource = (MessageSource) Contexto.getMessageSource();
		try {
			if (event.getComponent() instanceof SelectInputText) {
				SelectInputText autoComplete = (SelectInputText) event.getComponent();
				List<ProyectoUser> usersList = mgrProyectoUser.buscarUsers((String) event.getNewValue(), Integer.parseInt(messageSource.getMessage(MgrConstantes.KEY_SIZE_AUTOCOMPLETE, null, LocaleContextHolder.getLocale())));
				usersAutocomplete = new ArrayList<SelectItem>();
				for (ProyectoUser userList : usersList) {
					usersAutocomplete.add(new SelectItem(userList, userList.getFullName()));
				}
				if (autoComplete.getSelectedItem() != null) {
					ProyectoUser proyectoUser = (ProyectoUser) autoComplete.getSelectedItem().getValue();
					proyectoUserSelected.getProyectoUserPK().setUserId(proyectoUser.getProyectoUserPK().getUserId());
					proyectoUserSelected.setFullName(proyectoUser.getFullName());
					proyectoUserSelected.setLogin(proyectoUser.getLogin());
				} else {
					proyectoUserSelected.getProyectoUserPK().setUserId(null);
					proyectoUserSelected.setFullName("");
					proyectoUserSelected.setLogin("");
				}
			}
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		} catch (Exception exception) {
			FacesMessageUtil.error(context, messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(exception.getMessage(), exception);
		}
	}

	public void grabarProyectoUser() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrProyectoUser mgrProyectoUser = ((MgrProyectoUser) Contexto.getApplicationContext().getBean("mgrProyectoUser"));
			mgrProyectoUser.grabarProyectoUser(proyectoUserSelected);
			FacesMessageUtil.info(context, messageSource.getMessage(ServiqualityException.GRABAR_EXITO, null, LocaleContextHolder.getLocale()));
			traerLista();
			closePopupProyectoUserForm();
		} catch (ServiqualityException serviqualityException) {
			FacesMessageUtil.error(context, messageSource.getMessage(serviqualityException.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(serviqualityException.getMessage(), serviqualityException);
		}
	}
}
